//package com.atelier.plugin.ui;
//
//import com.atelier.plugin.dict.GlobalDict;
//import com.atelier.plugin.dto.SettingsStorageDTO;
//import com.atelier.plugin.entity.ProjectTemplate;
//import com.atelier.plugin.entity.ProjectTemplateGroup;
//import com.atelier.plugin.entity.Template;
//import com.atelier.plugin.entity.TemplateGroup;
//import com.atelier.plugin.tool.CloneUtils;
//import com.atelier.plugin.ui.component.*;
//import com.fasterxml.jackson.core.type.TypeReference;
//import com.intellij.ide.fileTemplates.impl.UrlUtil;
//import com.intellij.openapi.options.Configurable;
//import com.intellij.openapi.options.ConfigurationException;
//import com.intellij.openapi.util.NlsContexts;
//import com.intellij.util.ExceptionUtil;
//import org.jetbrains.annotations.Nullable;
//
//
//import javax.swing.*;
//import java.awt.*;
//import java.io.IOException;
//import java.util.Map;
//import java.util.function.Consumer;
//
///**
// * @author tangrufei
// * @date 2023-06-01 16:49
// */
//public class ProjectTemplateSettingForm implements Configurable, BaseSettings{
//    /**
//     * 模板描述信息，说明文档
//     */
//    private static final String PROJECT_TEMPLATE_DESCRIPTION_INFO;
//
//    static {
//        String descriptionInfo = "";
//        try {
//            descriptionInfo = UrlUtil.loadText(TemplateSettingForm.class.getResource("/description/projectTemplateDescription.html"));
//        } catch (IOException e) {
//            ExceptionUtil.rethrow(e);
//        } finally {
//            PROJECT_TEMPLATE_DESCRIPTION_INFO = descriptionInfo;
//        }
//    }
//    private JPanel mainPanel;
//    /**
//     * 类型映射配置
//     */
//    private Map<String, ProjectTemplateGroup> templateGroupMap;
//    /**
//     * 当前分组名
//     */
//    private ProjectTemplateGroup currTemplateGroup;
//    /**
//     * 编辑框组件
//     */
//    private EditorComponent<ProjectTemplate> editorComponent;
//    /**
//     * 分组操作组件
//     */
//    private GroupNameComponent<ProjectTemplate, ProjectTemplateGroup> groupNameComponent;
//    /**
//     * 编辑列表框
//     */
//    private EditListComponent<ProjectTemplate> editListComponent;
//
//    public ProjectTemplateSettingForm() {
//        this.mainPanel = new JPanel(new BorderLayout());
//    }
//
//    private void initGroupName() {
//        Consumer<ProjectTemplateGroup> switchGroupOperator = templateGroup -> {
//            this.currTemplateGroup = templateGroup;
//            refreshUiVal();
//            // 切换分组情况编辑框
//            this.editorComponent.setFile(null);
//        };
//
//        this.groupNameComponent = new GroupNameComponent<>(switchGroupOperator, this.templateGroupMap);
//        this.mainPanel.add(groupNameComponent.getPanel(), BorderLayout.NORTH);
//    }
//    private void initEditList() {
//        Consumer<ProjectTemplate> switchItemFun = template -> {
//            refreshUiVal();
//            if (template != null) {
//                this.editListComponent.setCurrentItem(template.getName());
//            }
//            editorComponent.setFile(template);
//        };
//        this.editListComponent = new EditListComponent<>(switchItemFun, "Template Name:", ProjectTemplate.class, this.currTemplateGroup.getElementList());
//    }
//
//    private void initEditor() {
//        this.editorComponent = new EditorComponent<>(null, PROJECT_TEMPLATE_DESCRIPTION_INFO);
//    }
//    private void initPanel() {
//        this.loadSettingsStore(getSettingsStorage());
//        // 初始化表格
//        this.initGroupName();
//        // 初始化编辑列表组件
//        this.initEditList();
//        // 初始化编辑框组件
//        this.initEditor();
//
//        // 左右组件
//        LeftRightComponent leftRightComponent = new LeftRightComponent(editListComponent.getMainPanel(), this.editorComponent.getMainPanel());
//        this.mainPanel.add(leftRightComponent.getMainPanel(), BorderLayout.CENTER);
//    }
//    @Override
//    public String getDisplayName() {
//        return "Project Template";
//    }
//
//    @Nullable
//    @Override
//    public String getHelpTopic() {
//        return getDisplayName();
//    }
//
//    @Override
//    public void loadSettingsStore(SettingsStorageDTO settingsStorage) {
//        // 复制配置，防止篡改
//        this.templateGroupMap = CloneUtils.cloneByJson(settingsStorage.getProjectTemplateGroupMap(), new TypeReference<Map<String, ProjectTemplateGroup>>() {
//        });
//        this.currTemplateGroup = this.templateGroupMap.get(settingsStorage.getCurrTemplateGroupName());
//        if (this.currTemplateGroup == null) {
//            this.currTemplateGroup = this.templateGroupMap.get(GlobalDict.DEFAULT_GROUP_NAME);
//        }
//        // 解决reset后编辑框未清空BUG
//        if (this.editorComponent != null) {
//            this.editorComponent.setFile(null);
//        }
//        this.refreshUiVal();
//    }
//
//    @Override
//    public @Nullable JComponent createComponent() {
//        this.initPanel();
//        return mainPanel;
//    }
//
//    /**
//     * 指示Swing窗体是否已修改。这种方法调用频率很高，所以应该不会花费很长时间。
//     *
//     * @return 如果修改了窗体内容，则返回<code>true</code>；如果没有修改，则返回<code>false</code
//     */
//    @Override
//    public boolean isModified() {
//        return !this.templateGroupMap.equals(getSettingsStorage().getTemplateGroupMap())
//                || !getSettingsStorage().getCurrTemplateGroupName().equals(this.currTemplateGroup.getName());
//    }
//
//    @Override
//    public void apply() {
//        getSettingsStorage().setProjectTemplateGroupMap(this.templateGroupMap);
//        getSettingsStorage().setCurrProjectTemplateGroupName(this.currTemplateGroup.getName());
//        // 保存包后重新加载配置
//        this.loadSettingsStore(getSettingsStorage());
//    }
//
//    /**
//     * 重绘窗体.
//     */
//    private void refreshUiVal() {
//        if (this.groupNameComponent != null) {
//            this.groupNameComponent.setGroupMap(this.templateGroupMap);
//            this.groupNameComponent.setCurrGroupName(this.currTemplateGroup.getName());
//        }
//        if (this.editListComponent != null) {
//            this.editListComponent.setElementList(this.currTemplateGroup.getElementList());
//        }
//    }
//
//}
